package cc.z8g.browser.core.tab

import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.os.Bundle
import android.os.Message
import android.webkit.WebView
import cc.z8g.browser.R
import cc.z8g.browser.core.BrowserConst
import cc.z8g.browser.dialog.BrowserDialog.resizeAndShow
import cc.z8g.browser.html.HtmlPageFactory
import cc.z8g.browser.utils.ThreadPool
import cc.z8g.browser.utils.sp.UserSp

/** 在创建[WebView]后运行的初始化器。 */
interface TabCreator {

    /** 初始化标签持有的[WebView]实例。如果加载了一个URL，应使用提供的[headers]来加载该URL。 */
    fun initialize(webView: WebView, headers: Map<String, String>)

}

/** 加载[url]的初始化器。 */
class UrlCreator(private val url: String) : TabCreator {

    override fun initialize(webView: WebView, headers: Map<String, String>) {
        webView.loadUrl(url, headers)
    }

}

/** 显示用户设置为主页的页面的初始化器。 */
class HomePageCreator(private val bookmarkPageInitializer: HtmlPageCreator) : TabCreator {

    override fun initialize(webView: WebView, headers: Map<String, String>) {
        val homepage = UserSp.getStartPage()
        when (homepage) {
            BrowserConst.SCHEME_BOOKMARKS -> bookmarkPageInitializer
            else -> UrlCreator(homepage)
        }.initialize(webView, headers)
    }

}

/** 加载由[HtmlPageFactory]构建的URL的初始化器。 */
class HtmlPageCreator(private val htmlPageFactory: HtmlPageFactory) : TabCreator {
    @SuppressLint("CheckResult")
    override fun initialize(webView: WebView, headers: Map<String, String>) {
        ThreadPool.postDisk {
            val pageStr = htmlPageFactory.createPage();
            ThreadPool.postUI {
                webView.loadUrl(pageStr, headers)
            }
        }
    }
}

/** 一个将[WebView]设置为[resultMessage]目标的初始化器。用于处理target="_blank"链接。 */
class ResultMessageCreator(private val resultMessage: Message) : TabCreator {

    override fun initialize(webView: WebView, headers: Map<String, String>) {
        resultMessage.apply {
            (obj as WebView.WebViewTransport).webView = webView
        }.sendToTarget()
    }

}

/** 使用[bundle]还原[WebView]状态的初始化器。 */
open class BundleCreator(private val bundle: Bundle) : TabCreator {

    override fun initialize(webView: WebView, headers: Map<String, String>) {
        webView.restoreState(bundle)
    }

}

/** 一种可以推迟到视图附加时执行的初始化器。[initialTitle] 是应该最初设置在标签页上的标题。 */
class FreezableBundleCreator(val bundle: Bundle, val initialTitle: String) : BundleCreator(bundle)

/** 一个不会加载任何内容到[WebView]的初始化器 */
class NoOpCreator : TabCreator {

    override fun initialize(webView: WebView, headers: Map<String, String>) = Unit

}

/** 在加载[url]之前询问用户的权限，如果用户拒绝权限，则加载主页。适用于另一个应用可能通过意图在浏览器中尝试打开恶意URL的情况。 */
class PermissionCreator(
    private val url: String,
    private val activity: Activity,
    private val homePageCreator: HomePageCreator
) : TabCreator {

    override fun initialize(webView: WebView, headers: Map<String, String>) {
        AlertDialog.Builder(activity).apply {
            setTitle(R.string.title_warning)
            setMessage(R.string.message_blocked_local)
            setCancelable(false)
            setOnDismissListener {
                homePageCreator.initialize(webView, headers)
            }
            setNegativeButton(android.R.string.cancel, null)
            setPositiveButton(R.string.action_open) { _, _ ->
                UrlCreator(url).initialize(webView, headers)
            }
        }.resizeAndShow()
    }

    /** 用于构建权限初始化器的工厂。 */
    interface Factory {
        /** 创建初始化器。 */
        fun create(url: String): PermissionCreator
    }

}
